2023/12/235364字符

typeof

typeof 返回的八个值:numberstringbooleanobjectundefinedfunctionbigInt(ES6+), symbol(ES6+) ECMA 6.1

var num = 123;  //--> number
    num = "123";  //--> string
    num = true;  //--> boolean
    num = [];  //--> object
    num = null;  //--> object
    num = undefined;  //--> undefined
    num = function(){}  //--> function
console.log(typeof(num)); 
console.log(typeof num);  // 另一种写法

string ToNumber = val => Number(val) ECMA 7.1.4.1

number ToString = val => val.toString() ECMA 7.1.17

显示类型转换

类型转换并不是 ECMAScript 语言的一部分;这里定义它们只是为了帮助规范 ECMAScript 语言的语义。其他更专门的抽象操作在整个规范中定义。ESMA 7.0.0

BigInt 类型没有隐式类型转换

Number(mix) 转化为数字

var num = Number("123");  //--> number:123
    num = Number(true);  //--> numeber:1
    num = Number(false);  //--> number:0
    num = Number(null);  //--> number:0
    num = Number(-123);  //--> number:-123
    num = Number(undefined);  //--> number:NaN
    num = Number(a);  //--> number:NaN
    num = Number(abc123);  //--> number:NaN
    num = Number(NaN);  //--> number:NaN

parseInt(string, radix) 转化为整形

radix 取值范围(2-36)

var num = parseInt("123");  //--> number:123
    num = parseInt(false);  //--> number:NaN
    num = parseInt(10, 16);  //--> number:16  以十六进制为机理转化为十进制
    num = parseInt("b", 16);  //--> number:11
    num = parseInt(3, 2);  //--> NaN (二进制里没有 3)
    num = parseInt("123abc");  //--> 123  转化到非数字类截止
    num = parseInt(123.9);  //--> number:123

parseFloat(string) 转化为浮点类型

var num = parseFloat(123.3);  //--> number:123.3
    num = parseFloat("123.3abc");  //--> number:123.3  转化到非数字类截止( . 除外)

toString(radix)

var num = 10;
num.toString();  //--> string:10  undefined 和 null 会报错
num.toString(8);  //--> string:12  以八进制目标进制进行转化

String(mix) 转化为字符串

var num = String(undefined);  //--> string:undefined  写任何东西都会转化为字符串

Boolean() 转化为布尔值

var num = Boolean("");
console.log(topeof(num) + ":" + num);  //--> boolean:false

进制转换

// 2  -->  10  -->  16
// perseInt  toString
var num = 10000;
var text = parseInt(num, 2);
console.log(text.toSstring(16));

隐式类型转换

isNaN () 转化过程:先将值隐式的放入 Number 进行判断,如果是返回 false

var num = isNaN(NaN);  //--> boolean:true    Number(NaN) --> NaN --> true
    num = isNaN("NaN");  //--> boolean:true
    num = isNaN(123);  //--> boolean:false    Number(123)  --> 123 --> false
    num = isNaN("123");  //--> boolean:false
    num = isNaN(abc);  //--> true
    num = isNaN(null);  //--> boolean:false    Number(null)  --> 0 --> false

isNaN 原理:

function myIsNaN(num){
    var ret = Number(num);
    ret += "";
    if(ret == "NaN"){
        return true;
    }else{
        return false;
    }
}

++ — (+/-(一元正负) 隐式调用 Number)

var num = "123";
    num ++;  //--> number:124
var num = + a;  //--> number:NaN

+ (当 + 两侧有一侧为 string 即调用 String)

var num = "a" + 1;  //--> string:a1
    num = 1 + "2" + "2";  //--> string:122
    num = 1 + -"1" + "2";  //--> string:02
    num = +"1" + "1" + "2";  //--> string:112
    num = "a" - "b" + "2";  //--> string:NaN2
    num = "a" - "b" + 2;  //--> string:NaN

* / %

var num = "a" * 1;  //--> number:NaN    Number("a") * Number(1) --> NaN * 1 --> NaN

&& || !

1 && 2  //--> number:2

< > <= >= (调用数字优先,其次 asc 码)

var num = "2" > 1;  //--> boolean:true
    num = "2" > "1";  //--> boolean:true

== !=

var num = "1" == 1;  //--> boolean:true
    num = 2 > 1 < 3;  //--> boolean:true
    num = 2 > 1 > 3;  //--> boolean:false
    num = undefined == null;  //--> boolean:true  系统定义的
    num = NaN == NaN;  //--> boolean:false
console.log(topeof() + ":" + num);

不发生类型转换

=== !==

var num = "1" === 1;  //--> false

面试题

console.log(typeof(a));  //--> 'undefined'  没有定义也不会报错
console.log(typeof(typeof(a)));  //--> string
var count = (1, 2);
console.log(count);  //--> 2
var f = (
    function f () {
        return "1";
    },
    function g () {
        return 2;
    }
)();
console.log(typeof(f));  // number
var x = 1;
if (function f () {}) {  // () 会把里面的东西变成表达式
    x += typeof(f);  // 唯一一个未经声明也不会报错的方法
}
console.log(x);  //--> 1number